import {randomIntROpen_0_n} from "@/num"


// 由小写字母组成的字符串
const LOWER_CASE = 'abcdefghijklmnopqrstuvwxyz'
// 由大写字母组成的字符串
const UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// 由数字组成的字符串
const DIGITS = "0123456789"


/**
 * 要生成的随机字符串的类型的字符串名称组成的常量对象
 */
export const RandomStrTypeConst = {
  // 生成由大小写字母和数字组成的随机字符串
  ALL: 'ALL',
  // 生成由小写字母组成的随机字符串
  LOWER_CASE: 'LOWER_CASE',
  // 生成由大写字母组成的随机字符串
  UPPER_CASE: 'UPPER_CASE',
  // 生成由大小写字母组成的随机字符串
  ALL_CASE: 'ALL_CASE',
  // 生成由数字组成的随机字符串
  DIGITS: 'DIGITS',
  // 生成由小写字母和数字组成的随机字符串
  LOWER_CASE_DIGITS: 'LOWER_CASE_DIGITS',
  // 生成由大写字母和数字组成的随机字符串
  UPPER_CASE_DIGITS: 'UPPER_CASE_DIGITS',
} as const


/**
 * 要生成的随机字符串类型
 */
export type RandomStrType = typeof RandomStrTypeConst[keyof typeof RandomStrTypeConst]


/**
 * 生成指定类型和长度的随机字符串<br/>
 *
 * @param {number} len 随机字符串长度，如果小于等于 0，则直接返回空字符串
 * @param {RandomStrType} randomStrType 随机字符串类型，默认为 {@link RandomStrTypeConst.ALL_CASE}
 * @returns {string} 指定类型和长度的随机字符串
 */
export const genRandomStr = (len: number, randomStrType: RandomStrType = RandomStrTypeConst.ALL_CASE) => {
  if (len <= 0) return '';
  // 存储生成的随机字符串
  let randomStr = '';
  // 用于生成随机字符串的字符集
  let charSet = '';
  // 根据随机字符串类型选择相应的字符集
  switch (randomStrType) {
    case RandomStrTypeConst.ALL:
      charSet = LOWER_CASE + UPPER_CASE + DIGITS;
      break;
    case RandomStrTypeConst.LOWER_CASE:
      charSet = LOWER_CASE;
      break;
    case RandomStrTypeConst.UPPER_CASE:
      charSet = UPPER_CASE;
      break;
    case RandomStrTypeConst.ALL_CASE:
      charSet = LOWER_CASE + UPPER_CASE;
      break;
    case RandomStrTypeConst.DIGITS:
      charSet = DIGITS;
      break;
    case RandomStrTypeConst.LOWER_CASE_DIGITS:
      charSet = LOWER_CASE + DIGITS;
      break;
    case RandomStrTypeConst.UPPER_CASE_DIGITS:
      charSet = UPPER_CASE + DIGITS;
      break;
    default:
      break;
  }
  // 生成随机字符串
  for (let i = 0; i < len; i++) {
    // 从字符集中随机选择一个字符
    randomStr += charSet[randomIntROpen_0_n(charSet.length)];
  }
  return randomStr;
}
